# 请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。例如，字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
# 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

# 这道题考察的是精细度，也就是各种特殊情况，而不是思维难度
# s字符串
# 判断条件：1.特殊符号不能重复出现（没有e的情况下）
#           2.+-不能同时出现(没有e的情况下，考虑+12e-4这个情况)
#           3.+-e.不能出现在末尾
#           4.+-.后面不能连接特殊符号，也就是+-.后面只能而且必须接数字
#           5.'.'和e不能出现在开头
#           6.e后面可以接+-号，但是不能接‘.’
#           7.没有e的情况下，+-只能出现在开头
#           8.e和E都合法的
# 满足以上，并且s中的字符只在数字和特殊字符中，那么就是True
# 所以可以考虑把原字符串分成两部分，split('e'),如果有e的话，否则只需要满足条件123457就可以了
# 有e的话，那么就需要拆分，只需要注意后面的部分不能有.即可

class Solution:
    def isNumeric(self, s):
        if not s:
            return False
        s = s.replace('E', 'e')
        if 'e' in s:
            if s[-1] == 'e' or s[0] == 'e':
                return False
        my_list = []
        if 'e' in s:
            my_list = s.split('e')
            if len(my_list) > 2:
                return False
            else:
                return self.isNum(my_list[0], False) and self.isNum(my_list[1], True)
        else:
            return self.isNum(s, False)

    def isNum(self, s, isEpart):
        number_list = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
        sp_list = ['+', '-', '.']

        if isEpart:  # 后面那部分
            if '.' in s:
                return False
        # 其余部分逻辑通用
        if s[-1] == '+' or s[-1] == '-' or s[-1] == '.':  # 特殊字符不能结尾
            return False
        if s.count('+') > 1 or s.count('-') > 1 or s.count('.') > 1:
            return False
        if s.count('+') > 0 and s.index('+') != 0:
            return False
        if s.count('-') > 0 and s.index('-') != 0:
            return False
        if s.count('+') > 0 and s.count('-') > 0:
            return False
        if s.count('.') > 0 and s[s.index('.') + 1] not in number_list:
            return False

        for i in s:
            if i not in number_list and i not in sp_list:
                return False

        return True


# 解法2：python自己的取巧解法
def isNumeric2(self, s):
    # write code here
    try:
        p = float(s)
        return True
    except:
        return False


# 正则表达式法
def isNumeric3(self, s):
    import re
    # write code here
    if re.match('^[\+\-]?[0-9]*(\.[0-9]*)?([eE][\+\-]?[0-9]+)?$', s):
        return True;
    else:
        return False;


myNum = Solution()
print(myNum.isNumeric('0.112e1'))
